//package com.competition.common.utils.easyexcel;
//
//import com.alibaba.excel.context.AnalysisContext;
//import com.alibaba.excel.event.AnalysisEventListener;
//import com.alibaba.excel.exception.ExcelDataConvertException;
//import com.alibaba.excel.metadata.CellExtra;
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//@Slf4j
//public class ExcelDateListener<M> extends AnalysisEventListener<M> {
//
//    private final ExcelReaderListenerCallback<M> callback;
//
//    // 每隔50条存储数据库，实际使用中可以3000条，然后清理list，方便内存回收
//    private static final int BATCH_COUNT = 50;
//    // 表头数据
//    Map<Integer,String> headMap=new HashMap<>();
//    // 缓存数据
//    List<M> cacheList = new ArrayList<>();
//    // 合并单元格
//    private final List<CellExtra> extraMergeInfoList = new ArrayList<>();
//
//    public ExcelDateListener(ExcelReaderListenerCallback<M> callback) {
//        this.callback = callback;
//    }
//
//    /**
//     * 获取合并单元格
//     */
//    public List<CellExtra> getExtraMergeInfoList() {
//        return this.extraMergeInfoList;
//    }
//
//    /**
//     * 这里会一行行的返回头
//     */
//    @Override
//    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
//        this.headMap=headMap;
//        log.info("解析到一条头数据:{}", JSON.toJSONString( headMap));
//    }
//
//
//    @Override
//    public void invoke(M data, AnalysisContext analysisContext) {
//        cacheList.add(data);
//        // 在这里可以做一些其他的操作，就靠自己去拓展了
//        // 达到BATCH_COUNT了，需要去存储一次数据库，防止数据几万条数据在内存，容易OOM
//        if (cacheList.size() >= BATCH_COUNT) {
//            // 这里是存数据库的操作
//            callback.convertData(cacheList,headMap);
//            // 存储完成清理 list
//            cacheList.clear();
//        }
//    }
//
//    /**
//     * 所有数据解析完成了 都会来调用
//     */
//    @Override
//    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//        callback.convertData(cacheList,headMap);
//        cacheList.clear();
//    }
//
//
//    /**
//     * 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行
//     */
//    @Override
//    public void onException(Exception exception, AnalysisContext context) {
//        // 如果是某一个单元格的转换异常 能获取到具体行号
//        // 如果要获取头的信息 配合invokeHeadMap使用
//        if (exception instanceof ExcelDataConvertException) {
//            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
//            log.error("第{}行，第{}列解析异常", excelDataConvertException.getRowIndex(),
//                    excelDataConvertException.getColumnIndex());
//        }
//    }
//
//    /**
//     * 读取条额外信息：批注、超链接、合并单元格信息等
//     */
//    @Override
//    public void extra(CellExtra extra, AnalysisContext context) {
//        log.info("读取到了一条额外信息:{}", JSON.toJSONString(extra));
//        switch (extra.getType()) {
//            case COMMENT:
//                log.info("额外信息是批注,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(), extra.getColumnIndex(),
//                        extra.getText());
//                break;
//            case HYPERLINK:
//                if ("Sheet1!A1".equals(extra.getText())) {
//                    log.info("额外信息是超链接,在rowIndex:{},columnIndex;{},内容是:{}", extra.getRowIndex(),
//                            extra.getColumnIndex(), extra.getText());
//                } else if ("Sheet2!A1".equals(extra.getText())) {
//                    log.info(
//                            "额外信息是超链接,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{},"
//                                    + "内容是:{}",
//                            extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
//                            extra.getLastColumnIndex(), extra.getText());
//                } else {
//                    log.error("Unknown hyperlink!");
//                }
//                break;
//            case MERGE:
//                log.info(
//                        "额外信息是合并单元格,而且覆盖了一个区间,在firstRowIndex:{},firstColumnIndex;{},lastRowIndex:{},lastColumnIndex:{}",
//                        extra.getFirstRowIndex(), extra.getFirstColumnIndex(), extra.getLastRowIndex(),
//                        extra.getLastColumnIndex());
//                extraMergeInfoList.add(extra);
//                break;
//            default:
//        }
//    }
//}
//
